package com.weixin.service;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.Element;

import com.weixin.beaninfo.LocationMSG;
import com.weixin.beaninfo.TextMSG;
import com.weixin.servlet.RelateServlet;
import com.weixin.util.AccessTokenUtils;
import com.weixin.util.AnalyzeXmlUtil;
import com.weixin.util.ReadyProcessUtils;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

public class SendService {
    private static final String AK="m0B4dSh0nCmIXEKwsUTCLQ7IywRRgaG7";//百度服务AK
    private static final String AppKey="ec1b94ae39972fa130c4296224214826";//聚合数据公交检索接口AK
/**
 * 将需要发送到用户上的信息，信息封装成对象，再将对象转为document，传入该方法中
 *      此方法负责返回xml字符串
 * @param document 封装了数据的JavaBean转化成的document
 */
    public String sendTextMSG(Document document){
        TextMSG text=new TextMSG();
        Object obj=AnalyzeXmlUtil.getObject(document, text);
        return AnalyzeXmlUtil.getXMLByObject(obj);
    }
    /**
     * 这个类主要用于获取用户输入地点的坐标，并根据坐标再执行相应的业务。
     * @author 海松
     *
     *
     *此服务类主要用于公交线路查询，输入当前位置，再输入需要前往的位置，得到线路
     *需要实现有两点：
     *              1，输入公交线路，得到该公交线路的站点流程
     *              2，输入当前位置和目的地，得到推荐的工具路线图
     *                                          1.火车
     *                                          2.公交
     *                                          3.地铁
     *
     *参数获取：在微信前台获取 当前位置和终点位置
     *
     */
        
        /**
         * 查询公交线路,通过用户输入的参数跳转到相应的网页，进入网页后抓取需要的数据。
         * @param Condition 将用户输入的内容进行分解，将各个数据分离，进行开展服务。
         * @return
         */
        public JSONObject getBus(Document document){
            JSONObject jsondata=new JSONObject();
            HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
            String Content=ReadyProcessUtils.deleteEnter(document.getRootElement().element("Content").getText());
            String[] Condition=Content.split(" ");
            //公交线路查询接口地址
            String strURL = "http://bus.aibang.com/CITY/?area=traffic&cmd=line&search=1&line=BUSNAME";  
            strURL=strURL.replaceFirst("CITY", spell(Condition[2]));
            strURL=strURL.replaceFirst("BUSNAME", Condition[1]);
            BufferedReader bufReader=null;
            StringBuilder contentBuf=null;
            HttpURLConnection httpConn=null;
            try{
                URL url = new URL(strURL);  
                httpConn = (HttpURLConnection) url.openConnection();  
                httpConn.setConnectTimeout(3000);  
                httpConn.setReadTimeout(3000);
                InputStreamReader input = new InputStreamReader(httpConn.getInputStream(), "utf-8");  
                bufReader = new BufferedReader(input);  
                String line = "";  
                contentBuf = new StringBuilder();  
                while ((line = bufReader.readLine()) != null) {  
                    contentBuf.append(line);  
                }  
            }catch(Exception e){
                jsondata.put("status", "0");
                jsondata.put("message", "failed");
                jsondata.put("results", "连接超时，请重新输入，若重新输入后还未获取到信息，那么对不起，这垃圾服务器已经炸了，过几分钟再来吧。");
                return jsondata;
            }
             finally {
                    if (httpConn != null) {
                        httpConn.disconnect(); //中断连接
                    }
                 }
             if(contentBuf==null){
                    jsondata.put("status", "0");
                    jsondata.put("message", "failed");
                    return jsondata;
                }
            String buf = contentBuf.toString(); 
            List<String> stationList=new ArrayList<String>();
            int beginIx = buf.indexOf("线路介绍");  
            int endIx = buf.indexOf("查看地图");  
            String result = buf.substring(beginIx, endIx);
            int start_index=0;
            int end_index=0;
            for(int i=0;i<result.length();i++){
                if(result.charAt(i)=='【'){
                    start_index=i;
                }
                if(result.charAt(i)=='】'){
                    end_index=i;
                    stationList.add(result.substring(start_index+1, end_index));
                    end_index=start_index=0;
                }
               }
         if(stationList!=null){
            jsondata.put("status", "0");
            jsondata.put("message", "ok");
            StringBuffer content=new StringBuffer();
            content.append("[");
            for(int i=0;i<stationList.size();i++){
                content.append("{");
                content.append("\"stationName\": \""+stationList.get(i)+"\"");
                content.append("}");
                if(i<stationList.size()-1){
                    content.append(",");
                }
            }
            content.append("]");
            jsondata.put("status", "0");
            jsondata.put("message", "ok");
            jsondata.put("results", JSONArray.fromObject(content.toString()));
           }
           else{
                jsondata.put("status", "2000");
                jsondata.put("message", "失败");
            }
            return jsondata;
        }
        /**
         * 查询某个服务在某个地区
         * @param Condition 将用户输入的内容进行分解，将各个数据分离，进行开展服务。以空格隔开每个参数 
         * @return
         */
        public JSONObject getService(Document document){
            String Content=ReadyProcessUtils.deleteEnter(document.getRootElement().element("Content").getText());
            String[] Condition=Content.split(" ");
            //地区POI服务接口地址
            String url="http://api.map.baidu.com/place/v2/search?q=Q&region=REGION&output=json&ak="+AK+"";
            url=url.replaceFirst("Q", Condition[1]);
            url=url.replaceFirst("REGION", Condition[2]);
            JSONObject jsondata=AccessTokenUtils.doGetStr(url);
            return jsondata;
        }
        /**
         * 通过输入地名来进行查找获取其经纬度
         * @param Content
         * @return
         */
        LocationMSG getLocationByContent(String Content){
            LocationMSG location=null;
            //获取经纬度的url
            String url="http://api.map.baidu.com/geocoder/v2/?address=ADDRESS&output=json&ak="+AK+"";
            //进行获取经纬度
            url=url.replaceFirst("ADDRESS", Content);
            JSONObject jsondata=AccessTokenUtils.doGetStr(url);
            if(jsondata==null){
                return null;
            }
            location=new LocationMSG();
            //将横纵坐标添加至对象中。
            location.setLocation_X(String.valueOf(JSONObject.fromObject(JSONObject.fromObject(jsondata.get("result")).get("location")).get("lng")));
            location.setLocation_Y(String.valueOf(JSONObject.fromObject(JSONObject.fromObject(jsondata.get("result")).get("location")).get("lat")));
            return location;
        }
    /**
     * 将汉字转化为拼音
     * @param src 需要转化为拼音的汉字
     * @return
     */
    String spell(String src){
        HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
         format.setCaseType(HanyuPinyinCaseType.LOWERCASE); // 小写拼音字母   
            format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); // 不加语调标识   
            format.setVCharType(HanyuPinyinVCharType.WITH_V); // u:的声母替换为v   
            StringBuffer sb = new StringBuffer();   
            int strLength = src.length();   
            try {   
                for (int i = 0; i < strLength; i++) {   
                    // 对英文字母的处理：小写字母转换为大写，大写的直接返回   
                    char ch = src.charAt(i);   
                    if (ch >= 'a' && ch <= 'z')   
                        sb.append((char) (ch - 'a' + 'A'));   
                    if (ch >= 'A' && ch <= 'Z')   
                        sb.append(ch);   
                    // 对汉语的处理   
                    String[] arr = PinyinHelper.toHanyuPinyinStringArray(ch, format);   
                    if (arr != null && arr.length > 0)   
                        sb.append(arr[0]);   
                }   
            } catch (BadHanyuPinyinOutputFormatCombination e) {   
                e.printStackTrace();   
            }   
            return sb.toString();   
    }
        
}
/**
 * 思考：
 *          返回接收业务需要：request发出来的xml
 *          返回发送业务需要：发送出去的xml，需要封装了数据的JavaBean
 */